package com.xhj.mybatis.reflection.invoker;


import java.lang.reflect.Method;

/**
 * AmbiguousMethodInvoker
 *
 * @author XJks
 * @description 该类用于表示方法调用时出现歧义（即有多个方法匹配，无法确定调用哪个）时的特殊处理器。它继承自 MethodInvoker，但在调用时会直接抛出异常，提示方法歧义。TODO:调用器：把“调用”抽象成统一接口。用于方法解析不明确（重载冲突）时的占位/报错包装。
 */
public class AmbiguousMethodInvoker extends MethodInvoker {
    /**
     * 保存异常信息的字符串，final 表示只赋值一次
     */
    private final String exceptionMessage;

    /**
     * 构造方法，接收一个方法对象和异常信息
     *
     * @param method           发生歧义的方法对象
     * @param exceptionMessage 异常提示信息
     */
    public AmbiguousMethodInvoker(Method method, String exceptionMessage) {
        // 调用父类的构造方法，传入方法对象
        super(method);
        // 保存异常信息
        this.exceptionMessage = exceptionMessage;
    }

    /**
     * 重写父类的 invoke 方法。
     * 当调用该方法时，直接抛出自定义的 ReflectionException，提示方法歧义。
     *
     * @param target 目标对象（未使用）
     * @param args   方法参数（未使用）
     * @throws RuntimeException 总是抛出 RuntimeException，提示方法歧义
     */
    @Override
    public Object invoke(Object target, Object[] args) throws RuntimeException {
        // 抛出反射异常，提示方法歧义
        throw new RuntimeException(exceptionMessage);
    }
}
